"""
XMind转Excel工具
功能：
1. 读取XMind文件
2. 保持多级层级关系
3. 生成规整的Excel表格
"""
import openpyxl
from openpyxl.utils import get_column_letter
import xmindparser
from typing import List, Dict
import os


class XMindToExcelConverter:
    def __init__(self, max_depth=5):
        self.max_depth = max_depth  # 最大支持层级

    def load_xmind(self, file_path: str) -> Dict:
        """加载XMind文件"""
        if not os.path.exists(file_path):
            raise FileNotFoundError(f"XMind文件不存在: {file_path}")

        # XMindparser返回的是列表格式，取第一个sheet
        data = xmindparser.xmind_to_dict(file_path)
        return data[0] if data else {}

    def _process_sheet(self, sheet_data: Dict) -> List[list]:
        """处理单个sheet页数据"""
        excel_rows = []

        def walk_node(node: Dict, current_depth: int, row_template: List):
            """递归遍历所有节点"""
            # 创建当前行副本避免污染原数据
            current_row = row_template.copy()

            # 处理当前节点（关键步骤）
            title = node.get('title', '').strip()
            if current_depth < self.max_depth:
                current_row[current_depth] = title
            else:
                # 超过最大深度时，合并到最后一列
                current_row[self.max_depth - 1] += f" > {title}"

            # 如果是叶子节点，添加到结果集
            if not node.get('topics'):
                excel_rows.append(current_row)

            # 处理子节点
            for child in node.get('topics', []):
                walk_node(child, current_depth + 1, current_row)

        # 从中心主题开始处理
        root_topic = sheet_data.get('topic', {})
        walk_node(root_topic, 0, [None] * self.max_depth)
        return excel_rows

    def to_excel(self, xmind_path: str, output_path: str):
        """核心转换方法"""
        # 1. 加载数据
        xmind_data = self.load_xmind(xmind_path)

        # 2. 转换结构
        excel_data = self._process_sheet(xmind_data)

        # 3. 写入Excel
        wb = openpyxl.Workbook()
        ws = wb.active
        # 写入表头
        ws.append(["功能模块", "用例标题", "用例步骤", "预期结果"])
        # 写入数据
        for row in excel_data:
            ws.append(row)

        # 自动调整列宽（提升可读性）
        for col_idx in range(self.max_depth):
            col_letter = get_column_letter(col_idx + 1)
            max_length = max(
                (len(str(row[col_idx])) if row[col_idx] else 0 for row in excel_data),
                default=10
            )
            ws.column_dimensions[col_letter].width = min(max_length + 2, 50)

        wb.save(output_path)
        print(f"转换成功！文件已保存至: {output_path}")


# 使用示例（实际调用）
if __name__ == "__main__":
    converter = XMindToExcelConverter(max_depth=5)

    # 获取用户输入
    xmind_file = input("请输入XMind文件路径: ").strip('"')
    excel_file = os.path.splitext(xmind_file)[0] + ".xlsx"

    # 执行转换
    try:
        converter.to_excel(xmind_file, excel_file)
    except Exception as e:
        print(f"转换失败: {str(e)}")